<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
</head>

<body>

    <script>
        // "函数瀑布" 来实现
        setTimeout(function () {
            console.log("First");
            setTimeout(function () {
                console.log("Second");
                setTimeout(function () {
                    console.log("Third");
                }, 2000);
            }, 2000);
        }, 2000);

        // Promise 实现:resolve 和 reject 都是函数，其中调用 resolve 代表一切正常，reject 是出现异常时所调用的：
        new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log("First");
                resolve();
            }, 2000);
        }).then(function () {
            return new Promise(function (resolve, reject) {
                setTimeout(function () {
                    console.log('Second');
                    resolve();
                }, 2000);
            });
        }).then(function () {
            setTimeout(function () {
                console.log('Third');
            }, 2000);
        });
        // ############################################################################
        const promise = new Promise((reslove, reject) => {
            //异步操作
            setTimeout(function () {
                if (Math.random() < 0.5) {
                    reslove("success");
                } else {
                    reject("error!");
                }
            }, 3000);
        });

        promise.then(result => {
            console.log(result);
        }).catch(result => {
            console.log(result);
        })
        // ###########################################################################################
        /* Promise 类有 .then() .catch() 和 .finally() 三个方法，这三个方法的参数都是一个函数，
            .then() 可以将参数中的函数添加到当前 Promise 的正常执行序列，
            .catch() 则是设定 Promise 的异常处理序列，
            .finally() 是在 Promise 执行的最后一定会执行的序列。 
            .then() 传入的函数会按顺序依次执行，有任何异常都会直接跳到 catch 序列：
             */
        new Promise(function (resolve, reject) {
            var a = 0;
            var b = 1;
            if (b == 0) {
                reject("Divide is zero");
            } else {
                resolve(a / b);
            }
        }).then((result) => {
            console.log('a / b = ' + result);
        }).catch((result) => {
            console.log(result);
        }).finally(() => {
            console.log('end')
        });
// #######################################################
        new Promise(function (resolve, reject) {
            console.log(1111);
            resolve(2222);
        }).then(function (value) {
            console.log(value);
            return 3333;
        }).then(function (value) {
            console.log(value);
            throw "An error";
        }).catch(function (err) {
            console.log(err);
        });
    </script>
</body>

</html>